package com.jf.cloud.service.sysmanager.common.util;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;

/**
 * 业务编号/序列帮助类
 *
 * @author ouyang 创建时间：2012-02-20 09:03:00
 */
@Service("sequenceHandler")
public class SequenceHandler {
	private static Log log = LogFactory.getLog(SequenceHandler.class);
	/**
	 * 业务编号MAP
	 */
	private static ConcurrentMap<String, String> BIZ_NO_MAP = new ConcurrentHashMap<String, String>();

	/**
	 * 兑换流水编号（规则：EX + yyyyMMddhhmm(18位) + 5位随机数字）
	 */
	public static final String EX = "EX";

	/**
	 * 初始化 数据 或 自动补充数据
	 *
	 * @author ouyang 创建时间：May 11, 2012 9:18:48 AM
	 */
	private static void initData() {
		if (BIZ_NO_MAP.size() < 500) {
			String code = "";
			String num = "";
			Map<String, String> newDataMap = new HashMap<String, String>();
			for (int i = 0; i < 10000; i++) {
				code = getTwoCode();
				num = RandomUtil.getRandomNumber(3);
				newDataMap.put(code + "_" + num, "");
			}
			BIZ_NO_MAP.putAll(newDataMap);
			newDataMap.clear();
			newDataMap = null;
		}
	}

	/**
	 * 得到两个 大写字母的随机码
	 *
	 * @author ouyang 创建时间：May 10, 2012 4:04:48 PM
	 */
	private static String getTwoCode() {
		String twoCode = RandomUtil.getRandomLeter(2).toUpperCase();
		// 过滤非法字母
		while ("SM".equals(twoCode) || "BB".equals(twoCode)) {
			twoCode = RandomUtil.getRandomLeter(2).toUpperCase();
		}
		return twoCode;
	}

	/**
	 * 得到 当前时间字符串 年月日时分
	 *
	 * @author ouyang 创建时间：May 10, 2012 4:04:48 PM
	 */
	private static String getTimeCode() {
		return DateUtil.getCurrentDateTime(DateUtil.YYYYMMDD_HHMM);
	}

	/**
	 * 按类型获取 自增 编号 规则: 两位前缀 + 2字母随机大写 + 年月日时分 + 3 随机数字 点卡编号规则：类型编号2为 + 4位标示 + 年月日时分 + 3 随机数字
	 */
	public String getBizNo(String prefix) {
		// 非法字母判断
		if (StringUtil.isNotEmpty(prefix) && (prefix.contains("SM") || prefix.contains("BB"))) {
			throw new RuntimeException("生成编号发生异常 编号前缀包含非法字母-----------");
		}
		String result = "";
		String[] num;
		try {
			num = null;
			initData();
			for (Map.Entry<String, String> e : BIZ_NO_MAP.entrySet()) {
				if (e != null && e.getKey().contains("_")) {
					num = e.getKey().split("_");
					BIZ_NO_MAP.remove(e.getKey());
					break;
				}
			}
			result = prefix + num[0] + getTimeCode() + num[1];

			// 过滤非法字母
			while (result.contains("SM") || result.contains("BB")) {
				result = getBizNo(prefix);
			}
		} catch (RuntimeException e) {
			log.error("生成编号发生异常", e);
			throw new RuntimeException("生成编号发生异常-----------");
		}
		return result;
	}

//	public static void main(String[] args) {
//
//		long cu = System.currentTimeMillis();
//		Map<String, String> orderNoMap = new HashMap<String, String>();
//		SequenceHandler handler = new SequenceHandler();
//		String currentNo = "";
//		for (int i = 0; i < 1000; i++) {
//			currentNo = handler.getBizNo("DDJS");
//			System.out.println("当前取的是:" + currentNo);
//			orderNoMap.put(currentNo, currentNo);
//		}
//		System.out.println(System.currentTimeMillis() - cu);
//		System.out.println("重复个数为:" + (1000 - orderNoMap.size()));
//	}

}
